

// 自定义组件
require([ 'garenjs/utils', 'garenjs/htmlui', 'garenjs/easyui',
		'datagrid-autoedit', "datagrid-lineEdit" ], function(utils, garenUI,
		easyUI, autoEdit, lineEdit) {

	easyUI.regFn({// 注册组件
		name : 'datagrid',// 组件名称
		tag : 'table',// html组件
		onBeforeCreate:function(opts){
			//设置字段默认值
			$.each(opts.columns,function(i,column){
				$.each(column,function(j,field){
					if(field.rowspan || field.colspan || field.hidden) return;
					if(field.width == null) field.width = 100;
					if(field.align == null) field.align = 'center';
				});
			});
		},
		onCreate : function(jqObj, uiOpts) {// 回调函数
			var mygrid = jqObj;
			if (uiOpts.formDialog)
				autoEdit(jqObj, uiOpts);// 对话框编辑模式
			else if (uiOpts.lineEdit)
				lineEdit(jqObj, uiOpts);// 行内编辑模式
			if ($.isArray(uiOpts.toolbarEx)) {
				var toolbar = {
					eName : 'toolbar',
					addMode : "prepend",
					elements : uiOpts.toolbarEx
				};
				var panel = mygrid.datagrid("getPanel");
				panel.find('div.datagrid-toolbar').remove();// 删除旧的工具栏
				panel.createUI(toolbar);
				mygrid.datagrid('resize');// 重绘datagrid
			}
			return;// 退出
		}
	});

	/*
	 * datagrid组件默认值
	 */
	$.extend($.fn.datagrid.methods, {
		grid2Json : function(jq, param) {
			var opts = jq.datagrid('options')
			var gridobj = jq;
			var options = gridobj.datagrid('options');
			var prefix = options.prefix || '';
			var idField = options.idField || '';
			var retJson = {};
			// 关闭编辑模式
			if (opts.editIndex > -1
					&& gridobj.datagrid('validateRow', opts.editIndex)) {
				gridobj.datagrid('endEdit', opts.editIndex);// 取消编辑
				opts.editIndex = -1;// 重置
				return [];
			}
			var insertJson = gridobj.datagrid('getChanges', "inserted");
			var updateJson = gridobj.datagrid('getChanges', "updated");
			var deleteJson = gridobj.datagrid('getChanges', "deleted");
			var delJson = deleteJson;

			// 重新组织删除Json,删除主键外字段
			delJson = $.map(deleteJson, function(item) {
				var obj = {};
				obj[idField] = item[idField];
				obj['recVer'] = item['recVer'];
				return obj;
			});
			/*
			 * 过滤updateJson中元素，有和delJson重复的则删除。
			 */
			updateJson = $.grep(updateJson, function(item) {
				var e = item[idField];
				var flag = true;
				$.each(delJson, function(i, m) {
					var f = m[idField];
					if (e == f) {
						flag = false;
						return false;// 结束遍历
					}
				});
				return flag;
			});
			// retJson[prefix + "CreateJson"] = $.toJSON(insertJson);
			// retJson[prefix + "UpdateJson"] = $.toJSON(updateJson);
			// retJson[prefix + "DestroyJson"] = $.toJSON(delJson);
			//return [ insertJson, updateJson, delJson ];
			return gridobj.datagrid('getRows');
		},
		updateRowDom:function(jq,params){
			var opts = jq.datagrid('options');
			var jqTr = opts.finder.getTr(jq[0],params.index,"body",2);
			if(jqTr.length == 0 && !jqTr.hasClass("datagrid-row-editing")) return;
			$.each(params.row,function(k,v){
				var dom = jqTr.find('>td[field='+k+']>div:not(.datagrid-editable)');
				if(dom.length == 0) return;
				dom.text(v);
			});
		},
		updateEditRow:function(jq,record){//更新编辑的表单 .datagrid('updateEdit',{index:2,row:formjson});
			function _2(a, o) {//判断是否引用
				for (var i = 0, _3 = a.length; i < _3; i++) {
					if (a[i] == o) {
						return i;
					}
				}
				return -1;
			};
			var gridObj = jq;
			var rows = gridObj.datagrid('getRows');
			var opts = gridObj.datagrid('options');
			var params = {index:opts.editIndex,row:record}
			if(params.index == null || params.index == -1) return;
			var idField = opts.idField;
			var oldrow = rows[params.index];//获取旧的数据
			var newrow = params.row;//新的数据
			var flag = false;
			if(oldrow == newrow) flag = true;
			else {
				//比较值是否变化
				$.each(newrow,function(i,e){
					if(e != oldrow[i]){
						flag = true;
						oldrow[i] = e;
					}
				});
			}
			//值已经变化
			if(flag){
				var griddata = $.data(jq.get(0), "datagrid");
				var urows = null;
				if(newrow[idField] == undefined){//新建
					urows = griddata.insertedRows;//获取新建行
				}else{
					urows = griddata.updatedRows;//获取更新行
				}
				//是否引用
				if(_2(urows,oldrow) == -1) urows.push(oldrow);
				gridObj.datagrid('updateRowDom',params);//刷新显示
			}
		}
	});
	/*
	 * datagrid组件默认值
	 */
	$.extend($.fn.datagrid.defaults, {
		fit : true,
		pagination : true,
		singleSelect : true,
		pageList : [ 30, 60 ],
		pageSize : 30,
		onBeforeLoad : function(params) {
			var mygrid = $(this);
			var opts = $(this).datagrid('options');
			// 首次加载页面，是否查询数据
			if (opts.autoload == false) {
				opts.autoload = true;
				return false;
			}
			// 分页参数重命名
			if (params['rows']) {
				params['pageSize'] = params['rows'];
				delete params['rows'];
			}
			if (params['page']) {
				params['pageNum'] = params['page'];
				delete params['page'];
			}
			// $ui.print(mygrid);
			var myform = null;
			var jqgridBody = mygrid.parents(".datagrid-wrap");
			if (opts.queryForm) {
				myform = jqgridBody.find(opts.queryForm);
			} else {
				myform = jqgridBody.find("form");
			}
			if (myform.length > 0) {
				if (myform.form('form2Json', params) == false)
					return false;
			}
			if (opts.onBeforeLoadEx) {
				if (false == opts.onBeforeLoadEx.call(this, params)) {
					$(this).datagrid('loadData', []);// 清空数据
					opts.queryParamsEx = null;// 清空条件
					return false;
				}
			}
			// 清空选中情况
			var data = $.data($(this).get(0), 'datagrid');
			data.selectedRows = [];
			data.checkedRows = [];
			// 缓存查询条件
			opts.queryParamsEx = params;
			return true;
		}
	});

});
